// filename: frontend/src/App.vue

<template>
  <router-view />
</template>

<script setup>
import { onLaunch, onShow } from "@dcloudio/uni-app";
import { useAuthStore } from "@/store/auth";

/**
 * 简单的 JWT 解码函数，用于获取 token 的过期时间 (exp)。
 * 注意：此函数不验证签名，仅用于客户端检查过期状态。
 * @param {string} token - JWT access_token.
 * @returns {object | null} - 解码后的 payload 或 null.
 */
function decodeJwt(token) {
  try {
    const base64Url = token.split('.')[1];
    const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
    const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
    return JSON.parse(jsonPayload);
  } catch (e) {
    return null;
  }
}

onLaunch(async () => {
  const authStore = useAuthStore();

  // 【核心修改】应用首次启动时的 Token 检查与刷新逻辑
  if (authStore.access_token) {
    const payload = decodeJwt(authStore.access_token);
    
    // 检查 payload 是否有效，以及 token 是否即将过期 (例如，提前 60 秒)
    if (payload && payload.exp) {
      const now = Math.floor(Date.now() / 1000);
      // 如果 token 已经过期或在未来 60 秒内即将过期
      if (payload.exp < now + 60) { 
        console.log("Token is expired or expiring soon. Attempting to refresh...");
        try {
          // 主动尝试刷新 token
          await authStore.refreshToken();
          console.log("Token refreshed on launch.");
        } catch (error) {
          console.warn("Failed to refresh token on launch. User will be logged out if refresh token is also invalid.");
          // 如果刷新失败，authStore.refreshToken 内部会自动处理登出，无需额外操作
        }
      }
    }
  }

  // 无论刷新成功与否，都调用一次获取未读数。
  // 如果刷新成功，这里会用新 token；如果失败，会自动降级为游客请求（虽然会失败，但符合逻辑）。
  authStore.fetchTotalUnreadCounts();
});

onShow(() => {
  const authStore = useAuthStore();
  // 应用从后台切到前台时，常规性地获取所有未读数。
  // 如果此时 token 过期，会被我们的 request 工具自动拦截和刷新。
  authStore.fetchTotalUnreadCounts();
});
</script>

<style lang="scss">
page {
  height: 100%;
}

uni-tabbar {
  .uni-tabbar {
    max-width: 800px;
    margin: auto;
  }
}
</style>